class MemoryContextMgr;

class MemoryContext1
{
	public:
		static MemoryContext TopMemoryContext;
		static MemoryContext ErrorContext;
	public:
		MemoryContext();
		static void MemoryContextInit(void);

		static void MemoryContextReset(MemoryContext context);
		static void MemoryContextResetChildren(MemoryContext context);
		static void MemoryContextDelete(MemoryContext context);
		static void MemoryContextDeleteChildren(MemoryContext context);
		static void MemoryContextResetAndDeleteChildren(MemoryContext context);
		
		static void MemoryContextSetParent(MemoryContext context, MemoryContext new_parent);
		static Size GetMemoryChunkSpace(void *pointer);
		static MemoryContext GetMemoryChunkContext(void *pointer);
		static MemoryContext MemoryContextGetParent(MemoryContext context);
		static bool MemoryContextIsEmpty(MemoryContext context);
		static void MemoryContextStats(MemoryContext context);
		static void MemoryContextStatsInternal(MemoryContext context, int level);
#ifdef MEMORY_CONTEXT_CHECKING
		static void MemoryContextCheck(MemoryContext context);
#endif
		static bool MemoryContextContains(MemoryContext context, void *pointer);
		
		static MemoryContext MemoryContextCreate(NodeTag tag, Size size,
					MemoryContextMethods *methods,
					MemoryContext parent,
					const char *name);
		
		static void* MemoryContextAlloc(MemoryContext context, Size size);
		static void* MemoryContextAllocZero(MemoryContext context, Size size);
		static void* MemoryContextAllocZeroAligned(MemoryContext context, Size size);
	private:
		NodeTag		type;			/* identifies exact kind of context */
		MemoryContextMethods *methods;		/* virtual function table */
		MemoryContext parent;		/* NULL if no parent (toplevel context) */
		MemoryContext firstchild;	/* head of linked list of children */
		MemoryContext nextchild;	/* next child of same parent */
		char	   *name;			/* context name (just for debugging) */
		bool		isReset;		/* T = no space alloced since last reset */

};


